#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<assert.h>
using namespace std;

// void Swap(int& a, int& b)
// void SLTPushBack(SLTNode*& phead, int x)
//int main()
//{
//	int a = 0;
//	int& b = a;
//	a++;
//	b++;
//
//	int x = 0;
//	int y = 1;
//
//	return 0;
//}

//int main()
//{
//	int a = 0;
//
//	// 引用必须初始化
//	// int& b;
//
//	int& c = a;
//	int d = 1;
//
//	// c变成d的别名？还是d赋值给c？
//	c = d;
//
//	// 一个对象可以有多个别名，可以别名继续取别名
//	int& e = a;
//	int& f = e;
//
//	return 0;
//}

//int main()
//{
//	int a = 0;
//	int b = 1;
//	int& c = a;
//	c = b;
//
//	return 0;
//}

#include <time.h>
struct A { int a[10000]; };

void TestFunc1(A aa) {}

void TestFunc2(A& aa) {}

void TestRefAndValue()
{
	A a;
	// 以值作为函数参数
	size_t begin1 = clock();
	for (size_t i = 0; i < 10000; ++i)
		TestFunc1(a);
	size_t end1 = clock();

	// 以引用作为函数参数
	size_t begin2 = clock();
	for (size_t i = 0; i < 10000; ++i)
		TestFunc2(a);
	size_t end2 = clock();

	// 分别计算两个函数运行结束后的时间
	cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
	cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
}


A a;
// 值返回
A TestFunc1() { return a; }
// 引用返回
A& TestFunc2() { return a; }

void TestReturnByRefOrValue()
{
	// 以值作为函数的返回值类型
	size_t begin1 = clock();
	for (size_t i = 0; i < 100000; ++i)
		TestFunc1();
	size_t end1 = clock();

	// 以引用作为函数的返回值类型
	size_t begin2 = clock();
	for (size_t i = 0; i < 100000; ++i)
		TestFunc2();
	size_t end2 = clock();

	// 计算两个函数运算完成之后的时间
	cout << "TestFunc1 time:" << end1 - begin1 << endl;
	cout << "TestFunc2 time:" << end2 - begin2 << endl;
}

//int main()
//{
//	//TestRefAndValue();
//	TestReturnByRefOrValue();
//
//	return 0;
//}

//int& Count()
//{
//	int n = 0;
//	n++;
//
//	return n;
//}
//
//int main()
//{
//	int ret = Count();
//	cout << ret << endl;
//
//	cout << ret << endl;
//
//	return 0;
//}

//int& Count()
//{
//	int n = 0;
//	n++;
//
//	return n;
//}
//
//int main()
//{
//	int& ret = Count();
//	cout << ret << endl;
//	cout << ret << endl;
//
//	Count();
//	cout << ret << endl;
//
//	return 0;
//}

// 出了函数作用域，返回对象就销毁了，不能用引用返回，否则结果是不确定
//int& Add(int a, int b)
//{
//	int c = a + b;
//	return c;
//}
//
//int main()
//{
//	int& ret = Add(1, 2);
//	cout << "Add(1, 2) is :" << ret << endl;
//
//	Add(3, 4);
//
//	cout << "Add(1, 2) is :" << ret << endl;
//	return 0;
//}

//int& Add(int a, int b)
//{
//	static int c;
//	c = a + b;
//
//	return c;
//}
//
//// 10:35继续
//int main()
//{
//	int& ret = Add(1, 2);
//	cout << "Add(1, 2) is :" << ret << endl;
//
//	Add(3, 4);
//
//	cout << "Add(1, 2) is :" << ret << endl;
//	return 0;
//}

//void func1()
//{
//	int c = 0;
//	cout << &c << endl;
//}
//
//void func2()
//{
//	int a = 0;
//	cout << &a << endl;
//}
//
//int main()
//{
//	/*func();
//
//	func();*/
//
//	func1();
//
//	func2();
//
//	return 0;
//}
